

VIVO = 1
MUERTO = 0


matriz = []
matriz_new = []


class Matrix():
    """Creo una matriz que sera una lista de listas
    la lista inicial tendra en cada posicion las filas
    de la matriz:
    Ejemplo de matriz 4xn
        [fila1, fila2, fila3, fila4]
    Donde fila_i es una lista de longitud n"""
    
    def __init__(self, rows, cols):
        self.cols = cols
        self.rows = rows
        
        # Inicializo matriz
        self.matrix = []
        
        for i in range(rows):
            # Creo una fila nuevo
            row = []
            
            for j in range(cols):
                # Lleno la fila con 0 en cada celda
                row.append(0)
            
            self.matrix.append(row)
    
    
    def get_value(self, row, col):
        
        # Si se pide una celda fuera de la matriz
        if self.rows < row or row < 1 or self.cols < col or col < 1:
            # Por defecto devuelvo el valor de una celda muerta
            return MUERTO
        
        return self.matrix[row-1][col-1]
    
    def set_value(self, row, col, value):
        
        # Si se pide una celda fuera de la matriz
        if self.rows < row or row < 1 or self.cols < col or col < 1:
            print 'Celda fuera de alcance'
            return -1
        
        self.matrix[row-1][col-1] = value
        
    def vecinos(self, row, col):
        #row = row-1
        #col = col-1 
        ret = []
        
        # Obtengo vecinos vivos
        for i in range(row-1, row+2):
            for j in range(col-1, col+2):
                if (i, j) != (row,col) and self.get_value(i,j) == VIVO:
                    ret.append((i,j))
        
        return ret
    
    def alive(self, row, col):
        return self.get_value(row,col) == VIVO
    
    def __repr__(self):
        
        ret = ''
        for i in range(self.rows):
            ret += 'Fila %s = %s \n'%(i+1,self.matrix[i])
        
        return ret
        